home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / progwin.zip / POPPAD3.ZIP / POPPAD.C < prev    next >
Text File  |  1991-10-24  |  8KB  |  323 lines

  1. /*-----------------------------------------
  2.     POPPAD.C -- Popup Editor
  3.         (c) Charles Petzold, 1990
  4.    ----------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "poppad.h"
  8. #define EDITID 1
  9.  
  10. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG);
  11.  
  12. BOOL ReadFile  (HANDLE ,HWND, HWND, POFSTRUCT, char *, BOOL);
  13. BOOL WriteFile (HANDLE, HWND, HWND, POFSTRUCT, char *, BOOL);
  14. BOOL PrintFile (HANDLE, HWND, HWND, char *);
  15.  
  16. LPSTR lstrrchr (LPSTR, char);
  17.  
  18. char szAppName  [] = "PopPad";
  19. char szFileSpec [] = "*.TXT";
  20. char szUntitled [] = "(untitled)";
  21.  
  22. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  23.                  LPSTR lpszCmdLine, int nCmdShow)
  24.      {
  25.      MSG        msg;
  26.      HWND        hwnd;
  27.      HANDLE     hAccel;
  28.      WNDCLASS   wndclass;
  29.  
  30.      if (!hPrevInstance)
  31.         {
  32.         wndclass.style        = CS_HREDRAW | CS_VREDRAW;
  33.         wndclass.lpfnWndProc    = WndProc;
  34.         wndclass.cbClsExtra    = 0;
  35.         wndclass.cbWndExtra    = 0;
  36.         wndclass.hInstance    = hInstance;
  37.         wndclass.hIcon        = LoadIcon (hInstance, szAppName);
  38.         wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW);
  39.         wndclass.hbrBackground    = GetStockObject (WHITE_BRUSH);
  40.         wndclass.lpszMenuName    = szAppName;
  41.         wndclass.lpszClassName    = szAppName;
  42.  
  43.         RegisterClass (&wndclass);
  44.         }
  45.  
  46.      hwnd = CreateWindow (szAppName, NULL,
  47.                     WS_OVERLAPPEDWINDOW,
  48.                     GetSystemMetrics (SM_CXSCREEN) / 4,
  49.                     GetSystemMetrics (SM_CYSCREEN) / 4,
  50.                     GetSystemMetrics (SM_CXSCREEN) / 2,
  51.                     GetSystemMetrics (SM_CYSCREEN) / 2,
  52.                     NULL, NULL, hInstance, lpszCmdLine);
  53.  
  54.      ShowWindow (hwnd, nCmdShow);
  55.  
  56.      UpdateWindow (hwnd);
  57.  
  58.      hAccel = LoadAccelerators (hInstance, szAppName);
  59.  
  60.      while (GetMessage (&msg, NULL, 0, 0))
  61.         {
  62.         if (!TranslateAccelerator (hwnd, hAccel, &msg))
  63.              {
  64.             TranslateMessage (&msg);
  65.             DispatchMessage (&msg);
  66.             }
  67.         }
  68.      return msg.wParam;
  69.      }
  70.  
  71. BOOL FAR PASCAL AboutDlgProc (HWND hDlg, WORD message, WORD wParam, LONG lParam)
  72.      {
  73.      switch (message)
  74.         {
  75.         case WM_INITDIALOG:
  76.              return TRUE;
  77.  
  78.         case WM_COMMAND:
  79.              switch (wParam)
  80.                 {
  81.                 case IDOK:
  82.                    EndDialog (hDlg, 0);
  83.                    return TRUE;
  84.                 }
  85.              break;
  86.         }
  87.      return FALSE;
  88.      }
  89.  
  90.   void DoCaption (HWND hwnd, char *szFileName)
  91.      {
  92.      char szCaption [40];
  93.  
  94.      wsprintf (szCaption, "%s - %s", (LPSTR) szAppName,
  95.              (LPSTR) (szFileName [0] ? szFileName : szUntitled));
  96.  
  97.      SetWindowText (hwnd, szCaption);
  98.      }
  99.  
  100.   short AskAboutSave (HWND hwnd, char *szFileName)
  101.       {
  102.       char szBuffer [40];
  103.       short nReturn;
  104.  
  105.       wsprintf (szBuffer, "Save current changes: %s",
  106.             (LPSTR) (szFileName [0] ? szFileName : szUntitled));
  107.  
  108.       if (IDYES == (nReturn = MessageBox (hwnd, szBuffer, szAppName,
  109.                            MB_YESNOCANCEL | MB_ICONQUESTION)))
  110.  
  111.           if (!SendMessage (hwnd, WM_COMMAND, IDM_SAVE, 0L))
  112.              return IDCANCEL;
  113.  
  114.       return nReturn;
  115.       }
  116.  
  117. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  118.      {
  119.      static BOOL     bNeedSave = FALSE;
  120.      static char      szRealFileName [16];
  121.      static FARPROC   lpfnAboutDlgProc;
  122.      static HANDLE    hInst;
  123.      static HWND    hwndEdit;
  124.      char            szFileName [16];
  125.      LONG            lSelect;
  126.      OFSTRUCT        of;
  127.      WORD            wEnable;
  128.  
  129.      switch (message)
  130.         {
  131.         case WM_CREATE:
  132.              hInst = ((LPCREATESTRUCT) lParam)->hInstance;
  133.              lpfnAboutDlgProc = MakeProcInstance (AboutDlgProc, hInst);
  134.  
  135.              hwndEdit = CreateWindow ("edit", NULL,
  136.                     WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
  137.                        WS_BORDER | ES_LEFT | ES_MULTILINE  |
  138.                        ES_AUTOHSCROLL | ES_AUTOVSCROLL,
  139.                     0, 0, 0, 0,
  140.                     hwnd, EDITID, hInst, NULL);
  141.  
  142.              SendMessage (hwndEdit, EM_LIMITTEXT, 32000, 0L);
  143.  
  144.              if (lstrlen (((LPCREATESTRUCT) lParam)->lpCreateParams))
  145.                 {
  146.                 OpenFile (((LPCREATESTRUCT) lParam)->lpCreateParams,
  147.                             &of, OF_PARSE);
  148.                 lstrcpy (szFileName,
  149.                       AnsiNext (lstrrchr (of.szPathName, '\\')));
  150.  
  151.                 if (ReadFile (hInst, hwnd, hwndEdit, &of,
  152.                       szFileName, FALSE))
  153.                   lstrcpy (szRealFileName, szFileName);
  154.                 }
  155.              DoCaption (hwnd, szRealFileName);
  156.              return 0;
  157.  
  158.         case WM_SETFOCUS:
  159.              SetFocus (hwndEdit);
  160.              return 0;
  161.  
  162.         case WM_SIZE:
  163.              MoveWindow (hwndEdit, 0, 0, LOWORD (lParam),
  164.                                HIWORD (lParam), TRUE);
  165.              return 0;
  166.  
  167.         case WM_INITMENUPOPUP:
  168.              if (lParam == 1)
  169.                 {
  170.                 EnableMenuItem (wParam, IDM_UNDO,
  171.                    SendMessage (hwndEdit, EM_CANUNDO, 0, 0L) ?
  172.                       MF_ENABLED : MF_GRAYED);
  173.  
  174.                 EnableMenuItem (wParam, IDM_PASTE,
  175.                     IsClipboardFormatAvailable (CF_TEXT) ?
  176.                       MF_ENABLED : MF_GRAYED);
  177.  
  178.                 lSelect = SendMessage (hwndEdit, EM_GETSEL, 0, 0L);
  179.  
  180.                 if (HIWORD (lSelect) == LOWORD (lSelect))
  181.                    wEnable = MF_GRAYED;
  182.                 else
  183.                    wEnable = MF_ENABLED;
  184.  
  185.                 EnableMenuItem (wParam, IDM_CUT,   wEnable);
  186.                 EnableMenuItem (wParam, IDM_COPY,  wEnable);
  187.                 EnableMenuItem (wParam, IDM_CLEAR, wEnable);
  188.                 }
  189.              return 0;
  190.  
  191.         case WM_COMMAND:
  192.              if (LOWORD (lParam) && wParam == EDITID)
  193.                 {
  194.                 switch (HIWORD (lParam))
  195.                    {
  196.                    case EN_UPDATE:
  197.                       bNeedSave = TRUE;
  198.                       return 0;
  199.  
  200.                    case EN_ERRSPACE:
  201.                       MessageBox (hwnd, "Edit control out of space.",
  202.                             szAppName, MB_OK | MB_ICONSTOP);
  203.                       return 0;
  204.                    }
  205.                 break;
  206.                 }
  207.  
  208.              switch (wParam)
  209.                 {
  210.                 case IDM_NEW:
  211.                    if (bNeedSave && IDCANCEL ==
  212.                         AskAboutSave (hwnd, szRealFileName))
  213.                      return 0;
  214.  
  215.                    SetWindowText (hwndEdit, "\0");
  216.                    szRealFileName [0] = '\0';
  217.                    DoCaption (hwnd, szRealFileName);
  218.                    bNeedSave = FALSE;
  219.                    return 0;
  220.  
  221.                 case IDM_OPEN:
  222.                    if (bNeedSave && IDCANCEL ==
  223.                         AskAboutSave (hwnd, szRealFileName))
  224.                      return 0;
  225.  
  226.                    if (ReadFile (hInst, hwnd,hwndEdit, &of,
  227.                              szFileName, TRUE))
  228.                      {
  229.                      lstrcpy (szRealFileName, szFileName);
  230.                      DoCaption (hwnd, szRealFileName);
  231.                      bNeedSave = FALSE;
  232.                      }
  233.  
  234.                    return 0;
  235.  
  236.                 case IDM_SAVE:
  237.                    if (szRealFileName [0])
  238.                       {
  239.                       if (WriteFile (hInst, hwnd, hwndEdit, &of,
  240.                                 szRealFileName, FALSE))
  241.                         {
  242.                         bNeedSave = FALSE;
  243.                         return 1;
  244.                         }
  245.                       return 0;
  246.                       }
  247.                                     // fall through
  248.                 case IDM_SAVEAS:
  249.                    if (WriteFile (hInst, hwnd, hwndEdit, &of,
  250.                             szFileName, TRUE))
  251.                     {
  252.                     lstrcpy (szRealFileName, szFileName);
  253.                     DoCaption (hwnd, szFileName);
  254.                     bNeedSave = FALSE;
  255.                     return 1;
  256.                     }
  257.                    return 0;
  258.  
  259.               case IDM_PRINT:
  260.                    PrintFile (hInst, hwnd, hwndEdit,
  261.                       szRealFileName [0] ? szRealFileName:
  262.                                      szUntitled);
  263.                    return 0;
  264.  
  265.                 case IDM_EXIT:
  266.                    SendMessage (hwnd, WM_CLOSE, 0, 0L);
  267.                    return 0;
  268.  
  269.                 case IDM_ABOUT:
  270.                    DialogBox (hInst, "AboutBox", hwnd,
  271.                             lpfnAboutDlgProc);
  272.                    return 0;
  273.  
  274.                 case IDM_UNDO:
  275.                    SendMessage (hwndEdit, WM_UNDO, 0, 0L);
  276.                    return 0;
  277.  
  278.                 case IDM_CUT:
  279.                    SendMessage (hwndEdit, WM_CUT, 0, 0L);
  280.                    return 0;
  281.  
  282.                 case IDM_COPY:
  283.                    SendMessage (hwndEdit, WM_COPY, 0, 0L);
  284.                    return 0;
  285.  
  286.                 case IDM_PASTE:
  287.                    SendMessage (hwndEdit, WM_PASTE, 0, 0L);
  288.                    return 0;
  289.  
  290.                 case IDM_CLEAR:
  291.                    SendMessage (hwndEdit, WM_CLEAR, 0, 0L);
  292.                    return 0;
  293.  
  294.                 case IDM_SELALL:
  295.                    SendMessage (hwndEdit, EM_SETSEL, 0,
  296.                              MAKELONG (0, 32767));
  297.                    return 0;
  298.                 }
  299.              break;
  300.  
  301.         case WM_CLOSE:
  302.              if (!bNeedSave || IDCANCEL !=
  303.                    AskAboutSave (hwnd, szRealFileName))
  304.                 DestroyWindow (hwnd);
  305.  
  306.              return 0;
  307.  
  308.         case WM_QUERYENDSESSION:
  309.              if (!bNeedSave || IDCANCEL !=
  310.                    AskAboutSave (hwnd, szRealFileName))
  311.                 return 1L;
  312.  
  313.              return 0;
  314.  
  315.         case WM_DESTROY:
  316.              PostQuitMessage (0);
  317.              return 0;
  318.         }
  319.      return DefWindowProc (hwnd, message, wParam, lParam);
  320.      }
  321.  
  322.  
  323.